#!/usr/bin/env ruby

module StringUtil
	def self.tex_escape(str)
		str.gsub(/[^ -'*-~]/) { "\\char#{$&.ord}" } # naive but whatever
	end
	def self.simplify(str)
		r = str.sub(/
			^.词[,，]\s?表?
			| ^[使意]动[,，]\s?
			| ^.作.[,，]\s?
			| ^语气词[,，]?\s?
		/x, "")
		r.empty? ? "×" : r
	end
	# *加粗* 和 _倾斜_ 替换为真正格式
	# 但是，倾斜不适用于中文版式——这里只替换了加粗。
	def self.format(str)
		str.gsub(/\*(.+?)\*/) { "\\textbf{#{$1}}" }
	end
end

def escape(str) # for compatibility
	StringUtil.tex_escape(StringUtil.simplify(str))
end

File.open("output.tex", "wb") do |fout|
	Dir.glob("data/???-*.txt") do |filename|
		File.open(filename, "r") do |f|
			i = 0
			f.each_line do |line|
				line.chomp!
				next if line.empty?
				i += 1
				line.gsub!("，", ", ")
				line.gsub!("：", ": ")
				line.gsub!("；", "; ")
				line.gsub!("！", "! ")
				line.gsub!("？", "? ")
				line.gsub!("“", " ``")
				line.gsub!("”", "'' ")
				line.gsub!("‘", "` ")
				line.gsub!("’", "' ")
				# 第一行 = 文章的题目
				# 第二行 = 作者和其相关信息
				case i
				when 1
					fout.puts "\\section{#{line}}"
				when 2
					fout.puts "\\Author{#{line}}\n"
				else
					line.gsub!(/^[\s\u3000]+|[\s\u3000]+$/, "")
					line.gsub!("（", "\\char40")
					line.gsub!("）", "\\char41")
					# [](NoteA) = 注音和通假字
					# [][NoteB] = 字词解释
					# {}{NoteC} = 句子翻译
					line.gsub!(/{(.+?)}{(.+?)}/) { "\\NoteC{#{$1}}{#{escape($2)}}" }
					line.gsub!(/(.)\((.+?)\)/) { "\\NoteA{#{$1}}{#{escape($2)}}" }
					line.gsub!(/\[(.+?)\]\[(.*?)\]/) { "\\NoteB{#{$1}}{#{escape($2)}}" }
					line.gsub!(/(?:\p{Han}|})(?=\\)/) { "#{$&}\\SkipSpecial " }
					line.gsub!(/}(\p{Han})/) { "}\\SkipSpecial #{$1}" }
					line.gsub!(/\p{Han}(?=\p{Han})/) { "#{$&}\\SkipNormal " }
					fout.puts "\\indent #{line}"
					fout.puts
				end
			end
		end
	end
end

module MyDictionary
	# 类名的首个字符必须是大写字母
	class A条目
		attr_accessor :字, :读音, :义项
		def initialize
			@义项 = []
		end
	end
	class A义项
		attr_accessor :读音, :活用, :解释, :今有, :例句
		def initialize
			@例句 = []
			@今有 = []
		end
	end
	class A例句
		attr_accessor :原文, :翻译, :出处
	end
	def self.go
		read
		make
	end
	def self.read
		@data = []
		File.open("data/dictionary.txt", "r") do |f|
			例句计数器 = nil
			f.each_line do |line|
				line.chomp!
				缩进 = 0
				line.sub!(/^\t+/) { 缩进 = $&.size; "" }
				next if line.empty?
				case 缩进
				when 0
					item = A条目.new
					item.读音, item.字, extra = line.split(" ")
					if extra
						p line
						abort "多余的字符"
					end
					if not item.字
						p line
						abort "条目没读音"
					end
					@data << item
break if item.字 == "白"
					例句计数器 = 0
				when 1
					@data.last.义项 << A义项.new
					line.sub!(/^(\S+) /) { @data.last.义项.last.读音 = $1; "" }
					line.gsub!(/\[(.+)\]/) { @data.last.义项.last.今有 << $1; "" }
					if line =~ /^\*/
						t = "☆"
						line = line[1..-1]
						line.sub!(/^(.作.|[使意]动)，/) { t = $1; "" }
						@data.last.义项.last.活用 = t
					end
					@data.last.义项.last.解释 = line
					例句计数器 = 1
				when 2
					if line =~ /^《/ and [2, 3].include?(例句计数器)
						@data.last.义项.last.例句.last.出处 = line
						例句计数器 = 1
					elsif 例句计数器 == 1
						@data.last.义项.last.例句 << A例句.new
						@data.last.义项.last.例句.last.原文 = line
						例句计数器 = 2
					elsif 例句计数器 == 2
						# TODO：从诗文数据库中查找对应句子的翻译。
						# 标点符号按照字典数据中给出的。
						line.gsub!(/[（）]/, "") # 随文翻译不需要括号
						# 在字典数据库中仍给出括号是为了以后增加诗文数据条目的方便。
						@data.last.义项.last.例句.last.翻译 = line
						例句计数器 = 3
					else
						p line
						abort "例句有问题"
					end
				else
					p line
					abort "错误的缩进"
				end
			end
		end
	end
	def self.make
		File.open("dictionary-output.tex", "wb") do |f|
			@data.each do |条目|
				f.puts "\\TiaoMu{"
				f.puts "\t\\Zi{#{条目.字}}{#{条目.读音}}"
				f.puts "\t\\YiXiangBiao{"
				条目.义项.each do |义项|
					今有 = 义项.今有
					今有 = [""] if not 今有
					今有.map! { |v| "\\JinYou{#{v}}" }
					今有字符串 = 今有.join("\\JinYouSeparator")
					f.print "\t\t\\YiXiang"
					f.print "{#{义项.读音}}{#{义项.活用}}{#{义项.解释}}{#{今有字符串}}"
					f.print "{#{义项.例句.size}}"
					f.puts "{"
					义项.例句.each do |例句|
						f.puts "\t\t\t\\LiJu{#{例句.原文}}{#{例句.翻译}}{#{例句.出处}}"
					end
					f.puts "\t\t}"
				end
				f.puts "\t}"
				f.puts "}"
			end
		end
	end
end
MyDictionary.go
exec "xelatex publication.tex & xelatex dictionary.tex"
